package com.hex2int;

public class ConverseUtils {

	/* *
	 * Convert byte[] to hex string.这里我们可以将byte转换成int，然后利用Integer.toHexString(int)
	 *来转换成16进制字符串。  
	 * @param src byte[] data  
	 * @return hex string  
	 */     
	public static String bytesToHexString(byte[] src){  
		StringBuilder stringBuilder = new StringBuilder("");  
		if (src == null || src.length <= 0) {  
			return null;  
		}  
		for (int i = 0; i < src.length; i++) {  
			int v = src[i] & 0xFF;  
			String hv = Integer.toHexString(v);  
			if (hv.length() < 2) {  
				stringBuilder.append(0);  
			}  
			stringBuilder.append(hv);  
		}  
		return stringBuilder.toString();  
	} 

	/**
	 * 将int类型变成byte[]类型
	 * <li> ffff -> {ff, ff} </li>
	 * <li>  fff -> {0f, ff} </li>
	 * <li>   ff -> {00, ff} </li>
	 * <li>    f -> {00, 0f} </li>
	 * @param data int类型数据
	 * @return byte[]类型数据
	 */
	public static byte[] intToBytesWithLen(int data, int len) {
		return intToByteArray2(data, len);
	}

	private static  byte[] intToByteArray2(int value, int len) {
		byte[] b = new byte[len];
		for(int i=0; i<len; i++) {
			b[len - i - 1] = (byte)((value >> 8 * i) & 0xff);
		}
		return b;
	}

	/**
	 * @deprecated 只能4个
	 * @param integer
	 * @return
	 */
	private static byte[] intToByteArray (final int integer) {
		int byteNum = (40 - Integer.numberOfLeadingZeros (integer < 0 ? ~integer : integer)) / 8;
		System.out.println(byteNum);
		byte[] byteArray = new byte[4];

		for (int n = 0; n < byteNum; n++)
			byteArray[3 - n] = (byte) (integer >>> (n * 8));

		return (byteArray);
	}


	/** 
	 * 基于arraycopy合并两个byte[] 数组 
	 * @param byte[]  bytes1 
	 * @param byte[]  bytes2 
	 * @return   byte[]   bytes3  
	 */  
	public   byte[]   combineTowBytes(byte[] bytes1,byte[] bytes2){      
		byte[] bytes3 = new byte[bytes1.length+bytes2.length];  
		System.arraycopy(bytes1,0,bytes3,0,bytes1.length);  
		System.arraycopy(bytes2,0,bytes3,bytes1.length,bytes2.length);  
		return bytes3 ;  
	}  

	
    //byte 与 int 的相互转换  
	/**
	 * int -> byte
	 * @param x
	 * @return
	 */
    public static byte intToByte(int x) {  
        return (byte) x;  
    }  
    
    
    /**
     * byte -> Int
     * @param b
     * @return
     */
    public static int byteToInt(byte b) {  
        //Java 总是把 byte 当做有符处理；我们可以通过将其和 0xFF 进行二进制与得到它的无符值  
        return b & 0xFF;  
    }  
}
